home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / RCS / Pdev.man,v < prev    next >
Text File  |  1990-06-27  |  32KB  |  851 lines

  1. head     1.5;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    ; strict;
  6. comment  @@;
  7.  
  8.  
  9. 1.5
  10. date     90.03.30.15.47.27;  author douglis;  state Exp;
  11. branches ;
  12. next     1.4;
  13.  
  14. 1.4
  15. date     90.01.12.16.47.59;  author douglis;  state Exp;
  16. branches ;
  17. next     1.3;
  18.  
  19. 1.3
  20. date     89.06.16.08.29.00;  author brent;  state Exp;
  21. branches ;
  22. next     1.2;
  23.  
  24. 1.2
  25. date     89.04.06.08.24.29;  author brent;  state Exp;
  26. branches ;
  27. next     1.1;
  28.  
  29. 1.1
  30. date     88.12.30.14.34.45;  author ouster;  state Exp;
  31. branches ;
  32. next     ;
  33.  
  34.  
  35. desc
  36. @@
  37.  
  38.  
  39. 1.5
  40. log
  41. @Added infor about Pdev_GetStreamID
  42. @
  43. text
  44. @' $Header: /sprite/src/lib/c/etc/RCS/Pdev.man,v 1.4 90/01/12 16:47:59 douglis Exp Locker: douglis $ SPRITE (Berkeley)
  45. .so \*(]ltmac.sprite
  46. .HS Pdev lib
  47. .BS
  48. .SH NAME
  49. Pdev_Open, Pdev_Close, Pdev_SetDefaultHandler, Pdev_SetStreamHandler, Pdev_EnumStreams \- Package for servicing pseudo-devices.
  50. .SH SYNOPSIS
  51. \fB#include <pdev.h>\fR
  52. .sp
  53. Pdev_Token
  54. .br
  55. \fBPdev_Open\fR(\fIname, realNamePtr, reqBufSize, readBufSize, service, clientData\fR)
  56. .br
  57. void
  58. .br
  59. \fBPdev_Close\fR(\fIpdevToken\fR)
  60. .br
  61. int
  62. .br
  63. \fBPdev_GetStreamID\fR(\fIpdevToken\fR)
  64. .br
  65. int (*
  66. .br
  67. \fBPdev_SetDefaultHandler\fR(\fIpdevToken, operation, handler\fR))()
  68. .br
  69. int (*
  70. .br
  71. \fBPdev_SetStreamHandler\fR(\fIstreamPtr, operation, handler\fR))()
  72. .br
  73. int
  74. .br
  75. \fBPdev_EnumStreams\fR(\fIpdevToken, func, clientData\fR)
  76. .SH ARGUMENTS
  77. .AS Pdev_CallBacks readBufSize
  78. .AP char *name in
  79. Name of file to use for pseudo-device.
  80. .AP char **realNamePtr out
  81. Where to store pointer to actual pseudo-device file name, or NULL
  82. if \fIname\fR is to be the complete name of pseudo-device file.
  83. .AP int reqBufSize in
  84. The preferred size for request buffers.
  85. .AP int readBufSize in
  86. The size for a read buffer.  Zero means no read buffering.
  87. .AP Pdev_CallBacks *service in
  88. A set of service call-back procedures.
  89. .AP ClientData clientData in
  90. Private user-defined data field.
  91. .AP Pdev_Token pdevToken in
  92. Token for the pseudo-device returned from \fBPdev_Open\fP.
  93. .AP Pdev_Stream *streamPtr in
  94. Handle for a stream to the pseudo-device.
  95. .AP int operation in
  96. \fBPDEV_OPEN\fP, \fBPDEV_CLOSE\fR, \fBPDEV_READ\fR, \fBPDEV_WRITE\fR,
  97. \fBPDEV_IOCTL\fR, \fBPDEV_SET_ATTR\fR, \fBPDEV_GET_ATTR\fR.
  98. .AP int (*handler)() in
  99. Service call-back procedure.
  100. .AP int (*func)() in
  101. A procedure applied to each stream to the pseudo-device.
  102. .BE
  103. .SH Pdev_Open
  104. .LP
  105. \fBPdev_Open\fR creates a pseudo-device
  106. and installs a set of service procedures for it.
  107. The pseudo-device can subsequently be opened by any number of
  108. regular (client) processes,
  109. and the service call-backs are made each time a client process makes
  110. a file system operation on the pseudo-device.
  111. Thus the service call-backs implement the standard file system
  112. operations for the pseudo-device while the Pdev package
  113. manages the interface between the kernel and the server process.
  114. .LP
  115. There are two ways that \fBPdev_Open\fR can pick the name of the file to
  116. use for the pseudo-device.  If \fIrealNamePtr\fR is NULL, then
  117. \fBPdev_Open\fR uses \fIname\fR as the name.  If \fIrealNamePtr\fR isn't
  118. NULL, then \fBPdev_Open\fR will generate a file name of the form
  119. \fIhostDir\fB/\fInameXX\fR, where \fIhostDir\fR is the name of
  120. a standard host-specific directory, \fIname\fR
  121. is the parameter to this procedure, and \fIXX\fR is a decimal number
  122. generated by \fBPdev_Open\fR.  \fBPdev_Open\fR tries numbers up from 1 until it finds
  123. one that works.  The name of the successful pseudo-device file is
  124. returned by storing a pointer to it at \fI*realNamePtr\fR;  the
  125. storage for the name is dynamically allocated with \fBmalloc\fR and
  126. must eventually be freed by the caller.
  127. .PP
  128. \fBPdev_Open\fR returns an opaque token that
  129. is used in calls to \fBPdev_Close\fP, \fBPdev_SetDefaultHandler\fP,
  130. and \fBPdev_EnumStreams\fP.
  131. If a pseudo-device couldn't be opened, then NULL is
  132. returned and \fBpdev_ErrorMsg\fR contains a string
  133. describing the problem.
  134. .PP
  135. After a successful \fBPdev_Open\fP call the Pdev package will set up a
  136. \fIservice stream\fP whenever a client process
  137. opens the pseudo-device.  Each service stream is identified
  138. to the call-backs by a \fBPdev_Stream\fP record.
  139. Thus the pseudo-device can be multiplexed over several clients
  140. with each client's request comming over a different service stream.
  141. However, forks and dups are not visible to the pseudo-device server,
  142. so more than one process might be using any particular service stream.
  143. .PP
  144. The \fIreqBufSize\fP is used to configure a request buffer associated
  145. with each service stream.  This size determines how many request messages
  146. can be buffered before the kernel is forced to wait for them to be
  147. serviced.  More than one request may be outstanding due to asynchronous writes,
  148. which are described below.
  149. A minimum size on the request buffer is enforced by the library,
  150. so zero can be passed in to get a default size (about 1 Kbyte). 
  151. .PP
  152. The \fIreadBufSize\fP is used to configure an optional read buffer associated
  153. with each service stream.  If this size is non-zero it indicates that
  154. a read buffer will be used to satisfy client read requests instead
  155. of using the read service call-back.
  156. In this case the Pdev package will allocate
  157. a read buffer each time a service stream is created and pass the address
  158. of this buffer to the open call-back.  After that it is up to the 
  159. server process to manage the read buffer.  See the device man page
  160. for \fBpdev\fP for details.
  161. .PP
  162. The \fIclientData\fP parameter to \fBPdev_Open\fP
  163. is passed to the open call-back as
  164. described below.  It is meant to be used as a pointer back to
  165. some top-level state of the pseudo-device.
  166. .LP
  167. The Pdev package uses the facilities of \fBFs_Dispatch\fR in order to keep
  168. track of the streams associated with the pseudo-device and ensure
  169. that Pdev is notified whenever those streams become readable.  In order
  170. to use Pdev, you must also use \fBFs_Dispatch\fR.
  171. .SH Pdev_Close
  172. .LP
  173. \fBPdev_Close\fR shuts down a pseudo-device, closing all the streams
  174. associated with it and releasing any resources allocated to the
  175. pseudo-device.  As a side-effect the close call-back is made to
  176. any existing service streams.  After this procedure returns, \fIpdevToken\fR
  177. should never be used again.
  178. .SH Pdev_GetStreamID
  179. .LP
  180. \fBPdev_GetStreamID\fR  returns the identifier for the stream
  181. associated with the token returned by \fBPdev_Open\fP.  This may be
  182. used for stream-oriented calls such as \fBfstat\fP but should not be
  183. used as the argument to \fBclose\fP (\fBPdev_Close\fP should be used
  184. instead.) 
  185. .SH "Pdev_EnumStreams"
  186. .PP
  187. The \fBPdev_EnumStreams\fP procedure is used to apply a function
  188. to all the service streams to the pseudo-device.  This
  189. enumeration procedure eliminates the need to keep track of
  190. each service stream.
  191. The \fIfunc\fP argument is called on each service stream as follows:
  192. .DS
  193. int
  194. (*func)(streamPtr, clientData)
  195.     Pdev_Stream *streamPtr;
  196.     ClientData clientData;
  197.  
  198. .DE
  199. Where \fIstreamPtr\fP identifies the service stream,
  200. and \fIclientData\fP is what was passed to \fBPdev_EnumStreams\fP.
  201. \fIfunc\fP should return zero to mean success,
  202. or a non-zero error status.  In the case of an error
  203. \fBPdev_EnumStreams\fP stops its enumeration and returns the non-zero status.
  204. .SH "Pdev_SetDefaultHandler"
  205. .LP
  206. \fBPdev_SetDefaultHandler\fP is used to set the call-back for individual
  207. pdev operations.
  208. It is not normally needed as you can define all
  209. the call-backs with \fBPdev_Open\fP (or \fBPfs_OpenConnection\fP).
  210. The call-backs passed to \fBPdev_Open\fP are inherited by
  211. each service stream that is created.  Changing a call-back
  212. with \fBPdev_SetDefaultHandler\fP changes the call-back for
  213. all subsequently created service streams.  It doesn't affect any
  214. service streams that are already established.
  215. This returns the old default call-back.
  216. .SH Pdev_SetStreamHandler
  217. .PP
  218. \fBPdev_SetStreamHandler\fP is used to set a call-back for an
  219. already existing service stream.
  220. It returns the old call-back.
  221. .SH "SERVICE PROCEDURES"
  222. .ta 1.5i 3.0i 3.5i
  223. .PP
  224. The call-back service procedures are given to \fBPdev_Open\fP
  225. (and \fBPfs_OpenConnection\fP) as a record
  226. of procedures:
  227. .DS
  228. typedef struct {
  229.     int (*open)();    /* PDEV_OPEN */
  230.     int (*read)();    /* PDEV_READ */
  231.     int (*write)();    /* PDEV_WRITE and PDEV_WRITE_ASYNC */
  232.     int (*ioctl)();    /* PDEV_IOCTL */
  233.     int (*close)();    /* PDEV_CLOSE */
  234.     int (*getAttr)();    /* PDEV_GET_ATTR */
  235.     int (*setAttr)();    /* PDEV_SET_ATTR */
  236. } Pdev_CallBacks;
  237. .DE
  238. .PP
  239. Any of the record elements can
  240. be NULL to indicate that the operation should be handled by
  241. a default handler.
  242. The \fIservice\fP parameter
  243. itself can also be NULL to indicate default
  244. handling for all operations.  This is only useful during initial test.
  245. If a client makes an operation for which no service procedure is provided
  246. it is simply a no-op; it is not an error.
  247. The global variable \fBpdev_Trace\fP can be set to a non-zero value
  248. to generate printfs to stderr when
  249. each service procedure (default or user-supplied) is invoked.
  250. .LP
  251. Service procedures should return zero to mean successful completion,
  252. otherwise they should return an appropriate errno value.
  253. Additionally, the \fBread\fP and \fBwrite\fP procedures
  254. use \fBEWOULDBLOCK\fR to indicate incomplete operations.
  255. This is described further below.
  256. .LP
  257. Each service procedure also sets the current select state bits for
  258. the pseudo-device.
  259. The select bits are used in the kernel's implementation
  260. of \fBselect\fR for pseudo-devices.  They should be a bitwise or
  261. combination of \fBFS_READABLE\fR, \fBFS_WRITABLE\fR, and \fBFS_EXCEPTION\fR.
  262. As well as setting this select state after each client operation,
  263. it may be set asynchronously with the \fBIOC_PDEV_READY\fP
  264. \fBioctl\fR command on the service stream.
  265. .PP
  266. These same service procedures are used for
  267. pseudo-device connections into the pseudo-file-system.
  268. See \fBPfs_Open\fP and \fBPfs_OpenConnection\fP.
  269. The \fBgetAttr\fP and \fBsetAttr\fP call-backs are only made to
  270. pseudo-file-system servers.
  271. For regular pseudo-devices the kernel takes care of all attribute handling.
  272. .SH open
  273. .ta 0.5i 3.0i 3.5i
  274. .DS
  275. int
  276. (*service->open)(clientData, streamPtr, readBuffer, flags, procID,
  277.     hostID, uid, selectBitsPtr)
  278.     ClientData clientData;    /* Private data passed to Pdev_Open */
  279.     Pdev_Stream *streamPtr;    /* Identifies stream to pseudo-device. */
  280.     char *readBuffer;    /* Storage for optional read buffer */
  281.     int flags;    /* Flags to the open system call. NOTE!
  282.          * These are Sprite flags defined in <fs.h>,
  283.          * not the Unix flags defined in <sys/file.h> */
  284.     int procID;    /* ID of process opening the pseudo-device */
  285.     int hostID;    /* Host where that process is executing */
  286.     int uid;    /* User ID of that process */
  287.     int *selectBitsPtr;    /* Return - the initial select state of the process */
  288. .DE
  289. .LP
  290. When a client process makes an \fBopen\fP system call on the pseudo-device
  291. the Pdev library package invokes the \fBopen\fP service call-back to
  292. give the server a chance to refuse or
  293. accept the open by the client process.  The return value of the
  294. open call-back is either 0 for success, or an appropriate errno value.
  295. .PP
  296. The \fBopen\fR call-back gets passed the \fIclientData\fP that was given
  297. to the \fBPdev_Open\fP procedure,
  298. and a new \fIstreamPtr\fP that is a handle on the service stream
  299. corresponding to the open by the client.
  300. \fIstreamPtr\fP is a pointer to a \fBPdev_Stream\fP
  301. record that contains a \fBclientData\fP field for use by the call-backs,
  302. and a \fBstreamID\fP field that is used in \fBioctl\fP calls
  303. on the service stream.
  304. The possible \fBioctl\fP calls are listed at the end of this man page.
  305. The \fIstreamPtr\fP gets passed to all the other call-backs,
  306. and is also passed to \fBPdev_SetStreamHandler\fP.
  307. .PP
  308. The parameters also include the
  309. useFlags passed to the \fBFs_Open\fP system call, and the user ID
  310. and Sprite hostID of the client process.
  311. (\fBFs_Open\fR is the Sprite version of \fBopen\fR.  The
  312. flag bits are different and are defined in <fs.h>.  Flags passed
  313. to \fBopen\fP are mapped to the Sprite flag bits you'll get here.)
  314. If the \fIreadBufSize\fP parameter to \fBPdev_Open\fP was non-zero then
  315. Pdev allocates \fIreadBuffer\fP and passes it to the open call-back.
  316. Thus there will be one read buffer for each service stream
  317. if the server is implementing read buffering.
  318. .SH close
  319. .ta 0.5i 3.0i 3.5i
  320. .DS
  321. int
  322. (*service->close)(streamPtr)
  323.     Pdev_Stream *streamPtr;    /* Identifies service stream */
  324. .DE
  325. .LP
  326. This is called when a service stream is closed.
  327. This happens either as a side effect of \fBPdev_Close\fP,
  328. or when the client has closed is last reference to the service stream.
  329. (Dups and forks are not visible to the pseudo-device server,
  330. so there is only one close per open system call by a client process.)
  331. .SH read
  332. .ta 0.5i 3.0i 3.5i
  333. .DS
  334. int
  335. (*service->read)(streamPtr, readPtr, freeItPtr, selectBitsPtr, sigPtr)
  336.     Pdev_Stream *streamPtr;    /* Identifies service stream */
  337.     Pdev_RWParam *readPtr;    /* Read parameter block */
  338.     Boolean *freeItPtr;    /* Set to TRUE if buffer should be free'd */
  339.     int *selectBitsPtr;    /* Return - select state of the pseudo-device */
  340.     Pdev_Signal *sigPtr;    /* Return - signal to generate, if any */
  341. .DE
  342. .LP
  343. The read service procedure is passed a record of type \fBPdev_RWParam\fP
  344. that indicates the \fBlength\fP, \fBoffset\fP, and \fBbuffer\fP
  345. for the read.
  346. The buffer is pre-allocated by the \fBPdev\fP library.
  347. If the read service procedure wants to use a different buffer
  348. it can change \fIreadPtr\fB->buffer\fR to reference its own storage.
  349. If this different storage area ought to be freed after
  350. the library completes the operation,
  351. then *\fIfreeItPtr\fR should be set to a non-zero value.
  352. .PP
  353. The \fIreadPtr\fB->length\fR record field indicates how much data is requested,
  354. and it should be updated to reflect the amount of data actually returned.
  355. If there is no data available on the pseudo-device then the
  356. read call-back should return \fBEWOULDBLOCK\fR
  357. and set \fIreadPtr\fB->length\fR to zero.
  358. This causes the kernel to block the client process until the select
  359. state of the pseudo-device is changed to indicate readability.
  360. If there are some bytes available the return value should be zero
  361. and \fIreadPtr\fB->length\fR set appropriately.
  362. If the read leaves no additional bytes available
  363. then the \fBFS_READABLE\fP bit can be cleared from *\fIselectBitsPtr\fP
  364. in order to block the next read request.
  365. End-of-file is indicated to the client by a zero return code and
  366. a zero number of bytes returned.
  367. .PP
  368. A signal can be generated in response to a read request by
  369. setting \fIsigPtr\fB->signal\fR to a non-zero value.
  370. \fIsigPtr\fB->code\fR can also be set to modify the signal meaning.
  371. Data can be returned if a signal is generated.
  372. The client application's system call will complete,
  373. its signal handler, if any, will be invoked,
  374. and the system call will be retried.
  375. .PP
  376. Note:  If there is a read buffer associated with the service stream,
  377. which is indicated by a non-zero valued \fIreadBufSize\fP
  378. parameter to \fBPdev_Open\fP,
  379. then this read call-back is never called.
  380. Instead the kernel takes data directly
  381. from the read buffer.  The protocol for adding data to the read buffer is
  382. described in the \fBpdev\fR device man page.
  383. .SH write
  384. .ta 0.5i 3.0i 3.5i
  385. .DS
  386. int
  387. (*service->write)(streamPtr, async, writePtr, selectBitsPtr, sigPtr)
  388.     Pdev_Stream *streamPtr;    /* Identifies service stream */
  389.     int async;    /* TRUE during an asynchronous write */
  390.     Pdev_RWParam *writePtr;    /* Write parameter block */
  391.     int *selectBitsPtr;    /* Return - select state of the pseudo-device */
  392.     Pdev_Signal *sigPtr;    /* Return - signal to generate, if any */
  393. .DE
  394. .LP
  395. The write service procedure is passed a parameter block that
  396. indicates the \fBlength\fP, \fBoffset\fP, and \fBbuffer\fP
  397. for the operation, plus various IDs of the application process.
  398. If \fIasync\fP is \fBFALSE\fP (zero)
  399. then \fIwritePtr\fB->length\fR should be
  400. updated to reflect how much data was processed by the service procedure.
  401. If \fIasync\fP is non-zero it indicates an asynchronous write and the service
  402. procedure must accept all of the data and the
  403. return value of \fIwritePtr\fB->length\fR is ignored.
  404. .PP
  405. If the server cannot accept all of the data it must return \fBEWOULDBLOCK\fR
  406. \fIand\fP update \fIwritePtr\fB->length\fR to indicate just how much data
  407. it accepted.  This return value causes the kernel to block the client
  408. process until the select state of the pseudo-device is changed
  409. to indicate writability.
  410. To repeat, returning a short write count and a zero return code will cause the
  411. kernel to immediately issue another write request to complete
  412. the client's write operation.
  413. By also returning \fBEWOULDBLOCK\fR the pseudo-device server forces the
  414. client process to wait until the pseudo-device becomes writable.
  415. .LP
  416. A signal to the client application can be generated as a side effect
  417. by setting \fIsigPtr\fB->signal\fR to a non-zero value.
  418. \fIsigPtr\fB->code\fR can be set to modify the signal.
  419. Data can be accepted by the write service procedure if a signal is generated.
  420. The client application's write call will complete,
  421. its signal handler, if any, will be invoked,
  422. and the write call will be retried.
  423. .SH ioctl
  424. .ta 0.5i 3.0i 3.5i
  425. .DS
  426. int
  427. (*service->ioctl)(streamPtr, ioctlPtr, selectBitsPtr, sigPtr)
  428.     Pdev_Stream *streamPtr;    /* Set by open service procedure */
  429.     Pdev_IOCParam *ioctlPtr;    /* I/O Control parameter block */
  430.     int *selectBitsPtr;    /* Return - select state of pdev */
  431.     Pdev_Signal *sigPtr;    /* Return - signal to generate, if any */
  432. .DE
  433. .LP
  434. The ioctl service procedure takes a parameter block that specifies
  435. the \fBcommand\fP, and two buffers,
  436. one containing input data (\fBinBuffer\fP),
  437. and one for data returned to the client (\fBoutBuffer\fP).
  438. The ioctl service has to set \fIioctlPtr\fB->outBufSize\fR to indicate how much
  439. data is being returned to the client process.
  440. The \fBPdev_IOCParam\fP struct also contains various processIDs,
  441. and the \fBformat\fP of the host on which the client
  442. application is executing.
  443. .LP
  444. The pseudo-device server can implement any \fIioctlPtr\fB->command\fR it wants.
  445. Generic commands are defined in <fs.h>, and other ranges of commands
  446. for particular devices and pseudo-devices are defined in header
  447. files in /sprite/src/lib/include/dev.
  448. .LP
  449. The input and output data is not byteswapped by the operating system.
  450. It is the server's responsibility to fix up the input and output
  451. buffers in the case that the client has a different byte order.
  452. The local byte order is defined as \fBMACH_BYTE_ORDER\fR by <machparam.h>,
  453. and the client's byte order and alignment are
  454. indicated by \fIioctlPtr\fB->format\fR.
  455. The \fBFmt_Convert\fR library routine can be used to
  456. swap and align incomming and outgoing buffers.
  457. .LP
  458. A signal to the client application can be generated as a side effect
  459. by setting \fIsigPtr\fB->signal\fR to a non-zero value.
  460. \fIsigPtr\fB->code\fR can be set to modify the signal.
  461. .SH getAttr
  462. .ta 0.5i 3.0i 3.5i
  463. .DS
  464. int
  465. GetAttrProc(streamPtr, attrPtr, selectBitsPtr)
  466.     Pdev_Stream *streamPtr;    /* Identifies service stream */
  467.     Fs_Attributes *attrPtr;    /* Return - attributes */
  468.     int *selectBitsPtr;    /* Return - select state of the pseudo-device */
  469. .DE
  470. .LP
  471. This procedure is called to handle an fstat() call on a file
  472. in a pseudo-file system.  The \fIstreamPtr\fP parameter identifies the
  473. open stream, and the server should fill in the attributes.
  474. This call-back is not made to regular pseudo-device servers,
  475. only to pseudo-file-system servers.
  476. .SH setAttr
  477. .ta 3.0i 3.5i
  478. .DS
  479. int
  480. SetAttrProc(streamPtr, flags, uid, gid, attrPtr, selectBitsPtr)
  481.     Pdev_Stream *streamPtr;    /* Identifies service stream */
  482.     int flags;    /* Indicate what attributes to set */
  483.     int uid;    /* Identifies user making the call */
  484.     int gid;    /* Identifies group of process */
  485.     Fs_Attributes *attrPtr;    /* Attributes to set as indicated by flags */
  486.     int *selectBitsPtr;    /* Return - select state of the pseudo-device */
  487. .DE
  488. .LP
  489. This procedure is called to set certain attributes of
  490. an open file in a pseudo-file system.  The \fIstreamPtr\fP
  491. parameter identifies the open stream.
  492. The flags argument contains an or'd combinantion of
  493. \fBFS_SET_TIMES\fR, \fBFS_SET_MODE\fR, \fBFS_SET_OWNER\fR,
  494. \fBFS_SET_FILE_TYPE\fR, \fBFS_SET_DEVICE\fR
  495. that indicate what attributes to set.  The attribute values are contained
  496. in \fI*attrPtr\fR.  The \fIuid\fR and \fIgid\fR arguments
  497. identify the calling process.
  498. This call-back is not made to regular pseudo-device servers,
  499. only to pseudo-file-system servers.
  500. .SH Service Stream Ioctls
  501. .ta 1.0i
  502. .PP
  503. The pseudo-device server can make a few \fBFs_IOControl\fP calls on
  504. its service streams.  The details of the calling sequences is described
  505. in the device man page for pseduo-devices (pdev).  The possible
  506. operations are:
  507. .IP IOC_PDEV_READY
  508. Used to change the select state of the pseudo-device.  The input buffer
  509. to Fs_IOControl should contain an or'd combination of
  510. \fBFS_READABLE\fR, \fBFS_WRITABLE\fR, or \fBFS_EXCEPTION\fR.
  511. .IP IOC_PDEV_SIGNAL_OWNER
  512. Used to send a signal to the owning process or process group of the
  513. pseudo-device.  This is useful for implementing interrupt characters
  514. in tty emulators.  No special permission is needed.
  515. .IP IOC_PDEV_WRITE_BEHIND
  516. Used to set or unset asynchronous writing.
  517. .IP IOC_PDEV_BIG_WRITES
  518. Used to allow or disallow writes larger than the request buffer.
  519. .IP IOC_PDEV_SET_PTRS
  520. Used to adjust pointers into the read buffer and the request buffer.
  521. Users of the Pdev package should only use this to adjust
  522. read buffer pointers.  Leave the request buffer pointers equal to -1
  523. so you don't mess up the managing of the request buffer.
  524. .PP
  525. For example:
  526. .DS
  527. status = Fs_IOControl(streamPtr->streamID, IOC_PDEV_READY,
  528.         sizeof(int), &selectBits, 0, NULL);
  529. .DE
  530. .SH SEE ALSO
  531. pdev (devices), Pfs, Swap_Buffer
  532. .SH KEYWORDS
  533. pseudo-device
  534. @
  535.  
  536.  
  537. 1.4
  538. log
  539. @updated byteOrder to format, per current version of struct.
  540. @
  541. text
  542. @d1 1
  543. a1 1
  544. ' $Header: /sprite/src/lib/c/etc/RCS/Pdev.man,v 1.3 89/06/16 08:29:00 brent Exp Locker: douglis $ SPRITE (Berkeley)
  545. d18 4
  546. d135 7
  547. @
  548.  
  549.  
  550. 1.3
  551. log
  552. @Updated to document new pseudo-device interface
  553. @
  554. text
  555. @d1 1
  556. a1 1
  557. ' $Header: /sprite/src/lib/c/etc/RCS/Pdev.man,v 1.2 89/04/06 08:24:29 brent Exp Locker: brent $ SPRITE (Berkeley)
  558. d387 1
  559. a387 1
  560. and the \fBbyteOrder\fP of the host on which the client
  561. d399 2
  562. a400 1
  563. and the client's byte order is indicated by \fIioctlPtr\fB->byteOrder\fR.
  564. @
  565.  
  566.  
  567. 1.2
  568. log
  569. @Updated to reflect change in the interface
  570. @
  571. text
  572. @d1 1
  573. a1 1
  574. ' $Header: /sprite/src/lib/c/etc/RCS/Pdev_Open.man,v 1.1 88/12/30 14:34:45 ouster Exp $ SPRITE (Berkeley)
  575. d100 2
  576. a101 2
  577. serviced.  More than one request may be outstanding due to stream sharing,
  578. or due to asynchronous writes.
  579. d227 3
  580. a229 1
  581.     int flags;    /* Flags to the open system call */
  582. d255 1
  583. a255 1
  584. useFlags passed to the \fBopen\fP system call, and the user ID
  585. d257 3
  586. d281 1
  587. a281 2
  588. (*service->read)(streamPtr, offset, procID, familyID, numBytesPtr,
  589.     bufferPtr,freeItPtr, selectBitsPtr)
  590. d283 1
  591. a283 6
  592.     int offset;    /* Byte offset at which to read */
  593.     int procID;    /* ProcessID of client */
  594.     int familyID;    /* FamilyID (process group) of client */
  595.     int *numBytesPtr;    /* In/Out - num bytes to read/were read */
  596.     char **bufferPtr;    /* Pointer to Buffer to hold data.  This
  597.          * can be re-allocated by ReadProc. */
  598. d286 1
  599. d289 9
  600. a297 6
  601. The read service procedure is passed a pointer to a buffer which it should fill
  602. with data in order to satisfy the client's read request.
  603. The read service procedure can either copy data into the preallocated buffer,
  604. or change the buffer to one of its own choosing.
  605. If the read service procedure allocates a buffer it can be free'd by
  606. the Pdev package by setting the *\fIfreeItPtr\fR flag to a non-zero value.
  607. d299 1
  608. a299 1
  609. The *\fInumBytesPtr\fR parameter indicates how much data is requested,
  610. d303 1
  611. a303 1
  612. and set *\fInumBytesPtr\fP to zero.
  613. d307 1
  614. a307 1
  615. and *\fInumBytesPtr\fP set appropriately.
  616. d314 8
  617. d333 1
  618. a333 2
  619. (*service->write)(streamPtr, async, offset, procID, familyID,
  620.     numBytesPtr, buffer, selectBitsPtr)
  621. d336 1
  622. a336 5
  623.     int procID;    /* ProcessID of client process */
  624.     int familyID;    /* FamilyID (process group) of client */
  625.     int offset;    /* Byte offset at which to write */
  626.     int *numBytesPtr;    /* In/Out - num bytes to write/were written */
  627.     char *buffer;    /* Buffer that holds data written by client */
  628. d338 1
  629. d341 5
  630. a345 3
  631. The write service procedure is passed a buffer containing the
  632. data written by the client.  If \fIasync\fP is \fBFALSE\fP (zero)
  633. the *\fInumBytesPtr\fR argument should be
  634. d349 1
  635. a349 1
  636. return value of \fInumBytesPtr\fR is ignored.
  637. d352 1
  638. a352 1
  639. \fIand\fP update \fInumBytesPtr\fP to indicate just how much data
  640. d361 8
  641. d373 1
  642. a373 2
  643. (*service->ioctl)(streamPtr, command, procID, familyID, byteOrder, 
  644.     inSize, inBuffer, outSizePtr, outBuffer, selectBitsPtr)
  645. d375 1
  646. a375 8
  647.     int command;    /* IOControl command */
  648.     int procID;    /* Process ID of calling process */
  649.     int familyID;    /* Family ID of calling process */
  650.     int byteOrder;    /* Indicates client's byte ordering */
  651.     int inSize;    /* Size of inBuffer */
  652.     char *inBuffer;    /* Buffer containing input data */
  653.     int *outSizePtr;    /* Return - size of outBuffer */
  654.     char *outBuffer;    /* Return - Buffer containing result data */
  655. d377 1
  656. d380 5
  657. a384 3
  658. The ioctl service procedure involves two buffers, one containing
  659. input data, and one for data returned to the client.
  660. The ioctlProc has to set *\fIoutSizePtr\fR to indicate how much
  661. d386 3
  662. d390 1
  663. a390 1
  664. The pseudo-device server can implement any \fIcommand\fP it wants.
  665. d399 2
  666. a400 2
  667. and the client's byte order is indicated by the byteOrder argument.
  668. The \fBSwap_Buffer\fR library routine can be used to
  669. d402 4
  670. @
  671.  
  672.  
  673. 1.1
  674. log
  675. @Initial revision
  676. @
  677. text
  678. @d1 1
  679. a1 1
  680. ' $Header: /sprite/doc/ref/lib/c/RCS/Pdev_Open,v 1.1 88/11/14 10:25:25 brent Exp Locker: brent $ SPRITE (Berkeley)
  681. d3 1
  682. a3 1
  683. .HS Pdev_Open libcalls
  684. d6 1
  685. a6 1
  686. Pdev_Open \- open pseudo-device and install service procedures for it.
  687. d10 19
  688. a28 2
  689. ClientData
  690. \fBPdev_Open\fR(\fIname, realNamePtr, service\fR)
  691. d30 1
  692. a30 1
  693. .AS char realNamePtr
  694. d36 19
  695. a54 2
  696. .AP IntProc *service
  697. Array of service call-back procedures.
  698. d56 1
  699. a56 1
  700. .SH DESCRIPTION
  701. d58 9
  702. a66 15
  703. \fBPdev_Open\fR creates a pseudo-device and installs a set of service procedures
  704. for it.  The service procedures are called when client processes
  705. open and use the pseudo-device.  The callbacks are given as an array
  706. of procedures (\fBIntProc\fP).  Any of the array elements can
  707. be NULL to indicate that the operation should be handled by
  708. a default handler.
  709. The \fBservice\fP parameter itself can also be NULL to indicate default
  710. handling for all operations.  This is only useful during initial test.
  711. If a client makes an operation for which no service procedure is provided
  712. it is simply a no-op; it is not an error.
  713. The global variable \fBpdevTrace\fP can be set to generate printfs when
  714. each service procedure (default or user-supplied) is invoked.
  715. The details of the service procedures
  716. are described below, after a description of how the pseudo-device's
  717. name is chosen by \fBPdev_Open\fR.
  718. d80 4
  719. a83 3
  720. .LP
  721. The return value of \fBPdev_Open\fR is a token for the pseudo-device, which must
  722. be used in calls to \fBPdev_Close\fR and \fBPdev_Ready\fR.
  723. d87 32
  724. d124 72
  725. d197 34
  726. a230 26
  727. The service procedures in the service array  are
  728. indexed by the pseudo-device operation type.  Thus
  729. .DS
  730. bzero(service, PDEV_NUM_OPS * sizeof(IntProc));
  731. service[PDEV_OPEN] = MyOpenProc;
  732. service[PDEV_READ] = MyReadProc;
  733. .DE
  734. is a valid initialization for the service array that
  735. defines open and read callbacks,
  736. and leaves the other pseudo-device operations as no-ops.
  737. .LP
  738. The
  739. return value of a service procedure will be the return value
  740. of the corresponding system call by the client,
  741. with the exception of FS_WOULD_BLOCK as described below.
  742. .SH PDEV_OPEN
  743. .DS
  744. ReturnStatus
  745. OpenProc(token, flags, pid, hostID, uid, privatePtr, selectBitsPtr)
  746.     ClientData token;    /* Token to identify stream to pseudo-device. */
  747.             /* Pass this token to Pdev_Ready */
  748.     int flags;        /* Flags to the open system call */
  749.     int pid;        /* ID of process opening the pseudo-device */
  750.     int hostID;        /* Host where that process is executing */
  751.     int uid;        /* User ID of that process */
  752.     ClientData *privatePtr;    /* Settable by openProc for its own use */
  753. a231 1
  754.             /* A combination of FS_READABLE|FS_WRITABLE|FS_EXCEPTION */
  755. d234 3
  756. a236 1
  757. The open service procedure gives the server a chance to refuse or
  758. d238 44
  759. a281 30
  760. open procedure is passed back as the return of the client's
  761. open system call.  The private data pointer can be set by the
  762. open service procedure to reference state specific to its own
  763. needs.  This pointer is passed back into the other service procedures.
  764. There is also a token passed into the openProc which distinguishes
  765. the stream to the pseudo-device.  This token is to be used with the
  766. Pdev_Ready procedure that indicates the stream to the pseudo-device
  767. is ready for I/O.
  768. .LP
  769. The selectBits are used in the kernel's implementation
  770. of \fBselect()\fR for pseudo-devices.  They should be a bitwise or
  771. combination of FS_READABLE, FS_WRITABLE, and FS_EXCEPTION.
  772. As well as setting this select state after each client operation,
  773. it may be set asynchronously with the Pdev_Ready procedure.
  774. .SH PDEV_CLOSE
  775. .DS
  776. ReturnStatus
  777. CloseProc(private)
  778.     ClientData private;    /* Set by openProc */
  779. .DE
  780. This is called when the client closes its stream to the pseudo-device.
  781. Dups and forks are not visible to the pseudo-device server,
  782. so the CloseProc is only called once when the stream to the pseudo-device
  783. is really going away.
  784. .SH PDEV_READ
  785. .DS
  786. ReturnStatus
  787. ReadProc(private, offset, familyID, numBytesPtr, bufferPtr, freeItPtr, selectBitsPtr)
  788.     ClientData private;    /* Set by openProc */
  789.     int offset;        /* Byte offset at which to read */
  790. d283 3
  791. a285 3
  792.     Address *bufferPtr;    /* Pointer to Buffer to hold data.  This
  793.              * can be re-allocated by ReadProc. */
  794.     Boolean *freeItPtr;    /* TRUE if *bufferPtr is dynamically allocated. */
  795. d291 1
  796. a291 1
  797. The read service procedure can either use the preallocated buffer,
  798. d293 36
  799. a328 15
  800. The freeItPtr parameter indicates if the buffer is dynamically allocated.
  801. The library uses a buffer on the stack which is FS_BLOCK_SIZE bytes long,
  802. but will dynamically allocate a new one if the read request is for
  803. more bytes than this.  If the service procedure changes the buffer
  804. it should free the passed in buffer if indicated by *freeItPtr,
  805. and it should set *freeItPtr appropriately so the library can
  806. free the buffer after completing the PDEV_READ transaction with the kernel.
  807. The numBytesPtr indicates how much data is requested, and it should be
  808. updated to reflect the amount of data actually returned.
  809. .SH PDEV_WRITE
  810. .DS
  811. ReturnStatus
  812. WriteProc(private, offset, familyID, numBytesPtr, buffer, selectBitsPtr)
  813.     ClientData private;    /* Set by openProc */
  814.     int offset;        /* Byte offset at which to write */
  815. d330 1
  816. a330 1
  817.     Address buffer;    /* Buffer that holds data written by client */
  818. d335 2
  819. a336 1
  820. data written by the client.  The numBytesPtr argument should be
  821. d338 30
  822. a367 14
  823. .SH PDEV_IOCTL
  824. .DS
  825. ReturnStatus
  826. IoctlProc(private, command, familyID, byteOrder, inSize, inBuffer, outSizePtr,
  827.     outBuffer, selectBitsPtr)
  828.     ClientData private;    /*Set by open service procedure*/
  829.     int command;    /*IOControl command*/
  830.     int familyID;    /*Family ID of calling process*/
  831.     int byteOrder;    /*Indicates clients byte ordering */
  832.     int inSize;        /*Size of inBuffer*/
  833.     Address inBuffer;    /*Buffer containing input data*/
  834.     int *outSizePtr;    /*Resutl - size of outBuffer*/
  835.     Address outBuffer;    /*Buffer containing result data*/
  836.     int *selectBitsPtr;    /*Return - select state of pdev*/
  837. d372 1
  838. a372 1
  839. The ioctlProc has to set *outSizePtr to indicate how much
  840. d374 82
  841. a455 5
  842. This data is not byteswapped by the operating system in the case
  843. that the client is on a host with different byte-ordering.
  844. The client's byte order is indicated by the byteOrder argument,
  845. and the \fBSwap_Buffer\fR library routine can be used to
  846. swap incomming and outgoing buffers.
  847. d457 1
  848. a457 1
  849. Pdev_Ready, Pdev_Close, Pfs_Open, Swap_Buffer
  850. @
  851.